package br.com.fogas.medicao.business;

import java.math.BigDecimal;
import java.util.Date;

import android.support.v4.app.Fragment;
import android.util.Log;
import br.com.fogas.database.entidade.Material;
import br.com.fogas.database.entidade.NotaFiscal;
import br.com.fogas.medicao.R;
import br.com.fogas.medicao.activity.SimulacaoMedidorFragment;
import br.com.fogas.utils.dialog.DialogAlert;
import br.com.fogas.utils.task.ServiceTask;
import br.com.fogas.utils.task.ServiceTaskBusiness;
import br.com.fogas.medicao.activity.dto.RetornoAutorizacaoNotaDto;
import br.com.fogas.medicao.activity.helper.LeituraMedidorHelper;
import br.com.fogas.medicao.application.Constants;
import br.com.fogas.medicao.application.LoadFragment;
import br.com.fogas.notafiscal.NotaFiscalBuilder;
import br.com.fogas.notafiscal.NotaFiscalEngine;
import br.com.fogas.notafiscal.enums.MaterialEnum;
import br.com.fogas.notafiscal.enums.PesoProdutoEnum;
import br.com.fogas.notafiscal.enums.TipoDeNotaEnum;
import br.com.fogas.notafiscal.exception.ClienteBloquedoException;
import br.com.fogas.notafiscal.modelo.NF;
import br.com.fogas.utils.FogasUtility;

public class NotaFiscalSimulacaoBusiness implements ServiceTaskBusiness {

	private LeituraMedidorHelper helper;

	public NotaFiscalSimulacaoBusiness(LeituraMedidorHelper helper) {
		this.helper = helper;
	}

	@Override
	public void start(ServiceTask serviceTask) {
		try {
			Material glp = helper.getDatabase().getMaterial().listarMaterialPorCodigo(MaterialEnum.GLP.getCodigo());
			BigDecimal quantidade = getCalcularQuantidadeLeituraAtual();
			Date dataNotaFiscal = new Date();
			
			NF nf = new NotaFiscalBuilder()
			.canal(helper.getPlanoCliente().getCliente().getTx_canal())
			.cliente(helper.getPlanoCliente().getCliente())
			.condicaoPgto(helper.getPlanoCliente().getCliente().getTx_cod_cond_pagto())
			.dataEntrega(dataNotaFiscal)
			.dataHora(dataNotaFiscal)
			.dataNota(dataNotaFiscal)
			.tipoNota(TipoDeNotaEnum.VENDADEGAS)
			.qrCodeLido(helper.isQrCodeLido())
			.medidor(helper.getMedidor())
			.adicionarItem(true, glp, quantidade, PesoProdutoEnum.GLP)
			.notaFiscal();
			
			NotaFiscal notaSimulacao = NotaFiscalEngine.gerarNotaFiscalSimulacao(helper.getDatabase(), nf);

			RetornoAutorizacaoNotaDto retornoNota = new RetornoAutorizacaoNotaDto(notaSimulacao, false, false, false);
			Fragment fragment = SimulacaoMedidorFragment.newInstance(retornoNota);
			LoadFragment loadFragment = new LoadFragment(helper.getFragment().getChildFragmentManager());
			loadFragment.initializeFragment(true, fragment, Constants.FRAGMENT_SIMULACAO);
		} catch (Exception e) {
			Log.e(Constants.TAG_LOG, e.getMessage());
			
			String message = "";
			
			if(e instanceof ClienteBloquedoException) {
				message = helper.getFragment().getString(R.string.label_simulacao_cliente_cloqueado);
			} else {
				message = helper.getFragment().getString(R.string.label_simulacao_error);
			}
			
			DialogAlert.newInstance()
			.setTitle(R.string.dialog_title_alert)
			.setCharMessage(message)
			.showDialog(helper.getFragment().getChildFragmentManager());
		}
	}
	
	private BigDecimal getCalcularQuantidadeLeituraAtual() {
		String consumoMin = String.valueOf(helper.getMedidor().getVl_min_kg().doubleValue());
		String ultimaLeitura = helper.getMedidor().getNb_ult_leitura();
		String leituraAtual = helper.getMedidor().getNb_leitura_atual();
		return FogasUtility.medidor.getKiloMedidorGlp(ultimaLeitura, leituraAtual, consumoMin);
	}
}